// 按键消抖模块
module key_debounce #
(
    parameter DELAY_T           = 1000_000          // 延迟20ms的50MHz时钟周期数
)
(
    input                       clk_50m,            // 50MHz系统时钟
    input                       rst_n,              // 复位信号
    input                       key,                // 按键输入信号
    output reg                  key_value,          // 消抖后的按键值
    output reg                  key_flag            // 是否消抖(0：抖动，1：已消抖)
);

    reg key_reg = 1;             // 保存按键key的值
    reg [19:0] delay_cnt = 0;    // 延迟计数器

    always @(posedge clk_50m or negedge rst_n) begin
        if(!rst_n) begin
            key_reg <= 1;       // 默认为高电平，即按键未按下
            delay_cnt <= 0;     // 计数器清零
        end else begin
            if(key_reg != key) delay_cnt <= DELAY_T; // 开始延迟倒计时
            else begin
                key_reg <= key;
                if(delay_cnt > 0) delay_cnt <= delay_cnt - 1;
                else delay_cnt <= 0;
            end
        end
    end

    always @(posedge clk_50m or negedge rst_n) begin
        if(!rst_n) begin
            key_value <= 1;
            key_flag <= 0;
        end else if(delay_cnt == 1) begin
            key_value <= key_reg;
            key_flag <= 1;
        end else begin
            key_value <= key_value;
            key_flag <= 0;
        end
    end

endmodule  //key_debounce